iT邦幫忙

2022 iThome 鐵人賽

DAY 8
0
自我挑戰組

Ruby OOP to Oops !n 30系列 第 8

IT 邦鐵人賽 Day 8 - Module

  • 分享至 

  • xImage
  •  

模組(Module)

我覺得模組的概念其實很像繼承,但在意義上有所不同。

想想看,如果有種行為是特定幾個類別所需要的,那該怎麼解決?
若是用繼承的方法,可能造成不需要的類別,擁有這樣的行為
或許會說,不如就在子類別覆寫父類別行為,就可以避免了
這樣的做法在技術上是可行的,但會造成繼承失去意義
因為子類別本來就應該擁有父類別所提供的行為,當行為被子類別覆蓋後,子類別就不再屬於父類別了

最好的方法是使用模組(Module)
如同裝備一樣,掛在身上去執行動作就好!

而模組與繼承相同的概念就是分離抽象

  • 繼承,是讓子類別實作父類別的抽象介面
  • 而模組也是提供抽象介面,讓不同的類別進行實作

方法

既然是繼承與模組都是提供介面使用,那方法是從何而來的呢?
https://ithelp.ithome.com.tw/upload/images/20220923/20151094szyrPcaDsE.png
這張圖可以簡單解釋部分流程!
首先天藍色部分都是類別,而循著線往上,天藍色彼此間都是繼承的關係
而黃色部份則是模組,而會因為方法使用不同,而擺在不同位置
像是圖中的C1類別使用include引進M1模組,所以他會存在C1之上,若是C1內找不到方法,就會向上跑到M1找尋,再找不到就在循線向上
perpend方法,則會放在引進類別的下方,所以會先到M2找尋,再依序向上

除此之外

為了不讓這整篇太複雜,簡單介紹一下extend方法。
其作用是將模組(Module)的行為直接加入到某個物件之中
換句話說

  • 使用模組來擴展類別,會在類別內建立類別方法
  • 使用模組來擴展類別內的實例,就會在實例內建立實例方法

還有一個叫做 單例類別(Singleton class) 這方法會專屬於特定物件
但不建議使用,因為可能會導致程式碼架構混亂

最後!其實書中還有解釋到 里氏替換原則 (Liskov substitution principle)
但這部分會在SOLID原則中一同解釋,所以這邊就不多說啦~

快樂星期五,就該好好休息囉! 假日快樂 :)

感謝大家 如有問題,再煩請大家指教!


上一篇
IT 邦鐵人賽 Day 7 - Inheritance
下一篇
IT 邦鐵人賽 Day 9 - SOLID
系列文
Ruby OOP to Oops !n 3020
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Jean_HSU
iT邦新手 5 級 ‧ 2022-09-25 19:40:57

嗶嗶嗶

我要留言

立即登入留言